Skip to content

bundle: convert the configuration to typed structs once after loading - #7098

Draft
denik wants to merge 91 commits into
denik/required-enum-typed-walkersfrom
denik/typed-config-walkers
Draft

denik wants to merge 91 commits into
denik/required-enum-typed-walkersfrom
denik/typed-config-walkers

Conversation

@denik

@denik denik commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Changes

Every mutator used to convert the bundle configuration between a dynamic value tree (libs/dyn) and the typed config.Root and back, before and after it ran. On large bundles that copying dominated command time (about 93 ms per mutator on a 1000-job bundle, over 100 mutators in bundle validate).

Now the configuration is loaded, includes are processed and the target is merged on the dynamic tree exactly as before. At the end of the load phase Root.FinishLoading converts the tree once into typed structs and drops it. Everything after that, i.e. all of initialize, validate, plan and deploy, uses the structs only. There is no dyn ↔ struct conversion per mutator any more.

  • Conversion. structvar.DecodeDyn is a third input of the typed decoder (next to YAML and View). It produces the struct, the pure ${...} references of fields that cannot hold a string (e.g. max_retries: ${var.n}), and a tree of source locations, taken from the dynamic tree. Root has two modes: dyn while loading (LoadDyn, Merge, MergeTargetOverrides, Mutate, as on main) and typed after FinishLoading.
  • Typed phase. libs/structs/structvar provides a read-only View, writes, merge/override (used by the Python mutator, set_variables, JSON flags and the planner), and variable resolution with the semantics and error text of dynvar. Where the whole configuration is traversed the code is generated by go run ./bundle/internal/validation: required and enum walkers, resource defaults, a strings walker and resource iterators in config. generate commands write YAML with the new libs/structs/structyaml (identical output).
  • libs/dyn is unchanged here. The parts the load no longer uses are removed in #7203.
  • Presence in the typed phase comes from ForceSendFields, never from locations. A value is present if it is non-zero, listed in its struct's ForceSendFields, or a pure reference; decoding records a written zero in ForceSendFields. What this loses compared to the dynamic tree:
    • a written zero in a struct without ForceSendFields is indistinguishable from unset, e.g. value: 0 in a job health rule or job_id: 0 in run_job_task warns as not set;
    • an empty mapping (presets: {}, resources: {}) is absent;
    • an explicit source: "" on spark_python_task / sql_task.file gets the GIT default on git_source jobs;
    • the pipeline development deprecation warning is not shown for development: true under mode: development (indistinguishable from the preset).
  • When authentication fails, the bundle summary shows workspace.host as written, including a ?o= or ?a= query; on main it showed the host with the query removed. The success path is unchanged.
  • Root.GetLocationOf/GetLocationsOf keep main's names and return the closest location; ...Exact variants return where a value is written. GetLocation(path string) stays as on main.

Why

bundle validate on a 1000-job bundle (test server; the machine was not quiet, median of 24 runs, interleaved):

main this PR
time 11.3 s 0.37 s
peak memory 666 MB 201 MB

The one-time conversion costs about 64 ms and 85 MB at 1000 jobs.

Tests

Unit and acceptance tests. Because loading, includes and target merging are main's code again, the load/merge edge cases recorded in acceptance/bundle/validate/{yaml_anchors,yaml_duplicate_keys,variables,targets,includes,nulls} (#7085) behave as on main again. The Badness markers that remain are main's own, plus: the location of an unknown field in a complex variable default is lost (raised by the typed resolver); presets.tags are not applied to a job whose tags is a reference to a whole map (same on main).

Difference from #6954

#6954 deletes libs/dyn and reimplements loading and merging on structs. That cost behavior (merge-key inheritance, anchors, null versus empty in merges) and left traversals that use reflection slower than the dynamic tree for whole-tree walks. This PR keeps main's load and merge code, so those behaviors are unchanged, and uses generated walkers in the typed phase.

This pull request and its description were written by Isaac.

@github-actions github-actions Bot added DABs DABs related issues PyDABs AIR Databricks AI Runtime CLI labels Oct 17, 2026
@denik
denik force-pushed the denik/typed-config-walkers branch from cb28c17 to b955c4d Compare October 18, 2026 06:43
denik added a commit that referenced this pull request Oct 18, 2026
Co-authored-by: Isaac <no-reply@databricks.com>
@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: f67c069

Run: 40868127380

Env ✅​pass 🙈​skip Time
✅​ aws linux-2core-8gb 281 36 5:32
✅​ aws-windows-latest-4core-16gb 283 34 5:56
✅​ azure linux-2core-8gb 280 36 5:44
✅​ azure-windows-latest-4core-16gb 282 34 6:00
✅​ gcp linux-2core-8gb 281 36 4:44
✅​ gcp-windows-latest-4core-16gb 283 34 4:22
Top 6 slowest tests (at least 2 minutes):
duration env testname
5:56 azure-windows-latest-4core-16gb TestAccept
5:53 aws-windows-latest-4core-16gb TestAccept
4:19 gcp-windows-latest-4core-16gb TestAccept
3:59 azure linux-2core-8gb TestAccept
3:57 aws linux-2core-8gb TestAccept
3:00 gcp linux-2core-8gb TestAccept

arushiagarwal-db pushed a commit to arushiagarwal-db/cli that referenced this pull request Oct 19, 2026
…atabricks#7085)

## Changes
Twenty-one new `bundle validate` acceptance tests, each pinning current
behaviour for a configuration edge case. They are grouped by topic under
`acceptance/bundle/validate/` (`yaml_anchors/` for anchors and merge
keys, `yaml_duplicate_keys/`, `variables/`, `targets/`, `includes/`,
`nulls/`, `references/`); ten existing tests on the same topics moved
into the groups.
- merge keys and aliases in `targets.*.variables` (inherited through a
target or root `<<`, aliases of a complex default, duplicate and
malformed `<<`, inline mappings),
- duplicate keys (with the processed JSON), timestamps as shorthands or
nested in complex defaults,
- references that resolve to the wrong type inside lists and maps,
- includes overriding fields with `""` / `0` / `false`, diagnostics
after a failed include merge,
- `resources: null`, `targets: false`, `schedule: null`,
- diagnostic locations for unknown fields in complex variables and
duplicated app resources.

`Badness` marks the cases where current behaviour is itself wrong:
- a timestamp nested in a complex default fails with an internal error;
a timestamp shorthand is dropped;
- an inline mapping as the merge value is rejected although the YAML
spec allows it;
- duplicate keys are accepted silently (the later one wins);
- an empty `resources:` section is an error without a location (empty
`targets`, `variables`, `sync` are fine); `targets: false` fails with an
internal "failed to rewrite" message;
- an explicitly null `schedule` is reported as missing its required
fields;
- a failed include merge reports an error without a location, and hides
the diagnostics of includes loaded after it.

## Why
They guard behaviour ahead of databricks#7098, which replaces `libs/dyn`: where it
differs, the test shows it.

## Tests
Goldens recorded on main.

This pull request and its description were written by Isaac.

---------

Co-authored-by: Isaac <no-reply@databricks.com>
@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Commit: f67c06960 | Workflow run

Regression test report

Selected 20 changed tests (limit=20, 1 not selected)

42 tests: regression=22 unreleased=0 coverage=20 failing=0

test branch main (06660cf) latest (v1.22.1)
TestAccept/bundle/python/pipeline-development-deprecated/DMS=/PYDAB_VERSION=0.266.0 ✅ ❌ ❌
TestAccept/bundle/python/pipeline-development-deprecated/DMS=/PYDAB_VERSION=current ✅ ❌ ❌
TestAccept/bundle/python/pipeline-development-deprecated/DMS=true/PYDAB_VERSION=0.266.0 ✅ ❌ ❌
TestAccept/bundle/python/pipeline-development-deprecated/DMS=true/PYDAB_VERSION=current ✅ ❌ ❌
TestAccept/bundle/refschema/DMS= ✅ ❌ ❌
TestAccept/bundle/refschema/DMS=true ✅ ❌ ❌
TestAccept/bundle/strict_profile_match/default_profile/host/DMS= ✅ ❌ ❌
TestAccept/bundle/strict_profile_match/default_profile/host/DMS=true ✅ ❌ ❌
TestAccept/bundle/strict_profile_match/host/DMS= ✅ ❌ ❌
TestAccept/bundle/strict_profile_match/host/DMS=true ✅ ❌ ❌
TestAccept/bundle/validate/app_resource_duplicate_name_location/DMS= ✅ ❌ ❌
TestAccept/bundle/validate/app_resource_duplicate_name_location/DMS=true ✅ ❌ ❌
TestAccept/bundle/validate/includes/merge_failure_short_circuits_diagnostics/DMS= ✅ ✅ ✅
TestAccept/bundle/validate/includes/merge_failure_short_circuits_diagnostics/DMS=true ✅ ✅ ✅
TestAccept/bundle/validate/nulls/resources_container/DMS= ✅ ✅ ✅
TestAccept/bundle/validate/nulls/resources_container/DMS=true ✅ ✅ ✅
TestAccept/bundle/validate/references/resolved_invalid_map_value/DMS= ✅ ✅ ✅
TestAccept/bundle/validate/references/resolved_invalid_map_value/DMS=true ✅ ✅ ✅
TestAccept/bundle/validate/references/resolved_invalid_sequence_item/DMS= ✅ ✅ ✅
TestAccept/bundle/validate/references/resolved_invalid_sequence_item/DMS=true ✅ ✅ ✅
TestAccept/bundle/validate/references/resolved_invalid_sequence_items/DMS= ✅ ❌ ❌
TestAccept/bundle/validate/references/resolved_invalid_sequence_items/DMS=true ✅ ❌ ❌
TestAccept/bundle/validate/references/to_omitted_struct_defaults/DMS= ✅ ❌ ❌
TestAccept/bundle/validate/references/to_omitted_struct_defaults/DMS=true ✅ ❌ ❌
TestAccept/bundle/validate/required/DMS= ✅ ❌ ❌
TestAccept/bundle/validate/required/DMS=true ✅ ❌ ❌
TestAccept/bundle/validate/targets/scalar_rewrite_diagnostic/DMS= ✅ ✅ ✅
TestAccept/bundle/validate/targets/scalar_rewrite_diagnostic/DMS=true ✅ ✅ ✅
TestAccept/bundle/validate/variables/complex_default_nested_timestamp/DMS= ✅ ❌ ❌
TestAccept/bundle/validate/variables/complex_default_nested_timestamp/DMS=true ✅ ❌ ❌
TestAccept/bundle/validate/variables/complex_unknown_field_location/DMS= ✅ ❌ ❌
TestAccept/bundle/validate/variables/complex_unknown_field_location/DMS=true ✅ ❌ ❌
TestAccept/bundle/validate/variables/target_timestamp_shorthand/DMS= ✅ ✅ ✅
TestAccept/bundle/validate/variables/target_timestamp_shorthand/DMS=true ✅ ✅ ✅
TestAccept/bundle/validate/yaml_anchors/duplicate_merge_keys/DMS= ✅ ✅ ✅
TestAccept/bundle/validate/yaml_anchors/duplicate_merge_keys/DMS=true ✅ ✅ ✅
TestAccept/bundle/validate/yaml_anchors/inline_merge_mapping/DMS= ✅ ✅ ✅
TestAccept/bundle/validate/yaml_anchors/inline_merge_mapping/DMS=true ✅ ✅ ✅
TestAccept/bundle/validate/yaml_anchors/invalid_merge_sequence_member/DMS= ✅ ✅ ✅
TestAccept/bundle/validate/yaml_anchors/invalid_merge_sequence_member/DMS=true ✅ ✅ ✅
TestAccept/bundle/validate/yaml_duplicate_keys/shadowed_invalid_subtree/DMS= ✅ ✅ ✅
TestAccept/bundle/validate/yaml_duplicate_keys/shadowed_invalid_subtree/DMS=true ✅ ✅ ✅
TestAccept/bundle/python/pipeline-development-deprecated/DMS=/PYDAB_VERSION=0.266.0: branch ✅ | main (06660cf) ❌ | latest (v1.22.1) ❌

main (06660cf):

acceptance_test.go:1341: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1341
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1082
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:659
        	Error:      	Not equal: 
        	            	expected: "\n>>> uv run [UV_ARGS] -q [CLI] bundle validate\nName: my_project\nTarget: dev\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/my_project/dev\n\nValidation OK!\n\n>>> uv run [UV_ARGS] -q [CLI] bundle validate --output json\n{\n  \"with_development\": true,\n  \"without_development\": true\n}\n"
        	            	actual  : "\n>>> uv run [UV_ARGS] -q [CLI] bundle validate\nWarning: The \"development\" property of pipelines is deprecated. Use \"mode: development\" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.\n  at resources.pipelines.with_development.development\n  in resources.py:7:1\n\nName: my_project\nTarget: dev\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/my_project/dev\n\nFound 1 warning\n\n>>> uv run [UV_ARGS] -q [CLI] bundle validate --output json\nWarning: The \"development\" property of pipelines is deprecated. Use \"mode: development\" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.\n  at resources.pipelines.with_development.development\n  in resources.py:7:1\n\n{\n  \"with_development\": true,\n  \"without_development\": true\n}\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2,2 +2,6 @@
        	            	 >>> uv run [UV_ARGS] -q [CLI] bundle validate
        	            	+Warning: The "development" property of pipelines is deprecated. Use "mode: development" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.
        	            	+  at resources.pipelines.with_development.development
        	            	+  in resources.py:7:1
        	            	+
        	            	 Name: my_project
        	            	@@ -8,5 +12,9 @@
        	            	 
        	            	-Validation OK!
        	            	+Found 1 warning
        	            	 
        	            	 >>> uv run [UV_ARGS] -q [CLI] bundle validate --output json
        	            	+Warning: The "development" property of pipelines is deprecated. Use "mode: development" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.
        	            	+  at resources.pipelines.with_development.development
        	            	+  in resources.py:7:1
        	            	+
        	            	 {
        	Test:       	TestAccept/bundle/python/pipeline-development-deprecated/DMS=/PYDAB_VERSION=0.266.0
        	Messages:   	bundle/python/pipeline-development-deprecated/output.txt vs /tmp/TestAcceptbundlepythonpipeline-development-deprecatedDMS=PY4130582375/002/output.txt

latest (v1.22.1): same output as main (06660cf)

TestAccept/bundle/python/pipeline-development-deprecated/DMS=/PYDAB_VERSION=current: branch ✅ | main (06660cf) ❌ | latest (v1.22.1) ❌

main (06660cf):

acceptance_test.go:1341: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1341
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1082
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:659
        	Error:      	Not equal: 
        	            	expected: "\n>>> uv run [UV_ARGS] -q [CLI] bundle validate\nName: my_project\nTarget: dev\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/my_project/dev\n\nValidation OK!\n\n>>> uv run [UV_ARGS] -q [CLI] bundle validate --output json\n{\n  \"with_development\": true,\n  \"without_development\": true\n}\n"
        	            	actual  : "\n>>> uv run [UV_ARGS] -q [CLI] bundle validate\nWarning: The \"development\" property of pipelines is deprecated. Use \"mode: development\" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.\n  at resources.pipelines.with_development.development\n  in resources.py:7:1\n\nName: my_project\nTarget: dev\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/my_project/dev\n\nFound 1 warning\n\n>>> uv run [UV_ARGS] -q [CLI] bundle validate --output json\nWarning: The \"development\" property of pipelines is deprecated. Use \"mode: development\" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.\n  at resources.pipelines.with_development.development\n  in resources.py:7:1\n\n{\n  \"with_development\": true,\n  \"without_development\": true\n}\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2,2 +2,6 @@
        	            	 >>> uv run [UV_ARGS] -q [CLI] bundle validate
        	            	+Warning: The "development" property of pipelines is deprecated. Use "mode: development" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.
        	            	+  at resources.pipelines.with_development.development
        	            	+  in resources.py:7:1
        	            	+
        	            	 Name: my_project
        	            	@@ -8,5 +12,9 @@
        	            	 
        	            	-Validation OK!
        	            	+Found 1 warning
        	            	 
        	            	 >>> uv run [UV_ARGS] -q [CLI] bundle validate --output json
        	            	+Warning: The "development" property of pipelines is deprecated. Use "mode: development" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.
        	            	+  at resources.pipelines.with_development.development
        	            	+  in resources.py:7:1
        	            	+
        	            	 {
        	Test:       	TestAccept/bundle/python/pipeline-development-deprecated/DMS=/PYDAB_VERSION=current
        	Messages:   	bundle/python/pipeline-development-deprecated/output.txt vs /tmp/TestAcceptbundlepythonpipeline-development-deprecatedDMS=PY3022699643/002/output.txt

latest (v1.22.1):

acceptance_test.go:1341: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1341
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1082
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:659
        	Error:      	Not equal: 
        	            	expected: "\n>>> uv run [UV_ARGS] -q [CLI] bundle validate\nName: my_project\nTarget: dev\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/my_project/dev\n\nValidation OK!\n\n>>> uv run [UV_ARGS] -q [CLI] bundle validate --output json\n{\n  \"with_development\": true,\n  \"without_development\": true\n}\n"
        	            	actual  : "\n>>> uv run [UV_ARGS] -q [CLI] bundle validate\nWarning: The \"development\" property of pipelines is deprecated. Use \"mode: development\" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.\n  at resources.pipelines.with_development.development\n  in resources.py:7:1\n\nName: my_project\nTarget: dev\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/my_project/dev\n\nFound 1 warning\n\n>>> uv run [UV_ARGS] -q [CLI] bundle validate --output json\nWarning: The \"development\" property of pipelines is deprecated. Use \"mode: development\" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.\n  at resources.pipelines.with_development.development\n  in resources.py:7:1\n\n{\n  \"with_development\": true,\n  \"without_development\": true\n}\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2,2 +2,6 @@
        	            	 >>> uv run [UV_ARGS] -q [CLI] bundle validate
        	            	+Warning: The "development" property of pipelines is deprecated. Use "mode: development" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.
        	            	+  at resources.pipelines.with_development.development
        	            	+  in resources.py:7:1
        	            	+
        	            	 Name: my_project
        	            	@@ -8,5 +12,9 @@
        	            	 
        	            	-Validation OK!
        	            	+Found 1 warning
        	            	 
        	            	 >>> uv run [UV_ARGS] -q [CLI] bundle validate --output json
        	            	+Warning: The "development" property of pipelines is deprecated. Use "mode: development" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.
        	            	+  at resources.pipelines.with_development.development
        	            	+  in resources.py:7:1
        	            	+
        	            	 {
        	Test:       	TestAccept/bundle/python/pipeline-development-deprecated/DMS=/PYDAB_VERSION=current
        	Messages:   	bundle/python/pipeline-development-deprecated/output.txt vs /tmp/TestAcceptbundlepythonpipeline-development-deprecatedDMS=PY1517959200/002/output.txt
FAIL
TestAccept/bundle/python/pipeline-development-deprecated/DMS=true/PYDAB_VERSION=0.266.0: branch ✅ | main (06660cf) ❌ | latest (v1.22.1) ❌

main (06660cf):

acceptance_test.go:1341: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1341
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1082
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:659
        	Error:      	Not equal: 
        	            	expected: "\n>>> uv run [UV_ARGS] -q [CLI] bundle validate\nName: my_project\nTarget: dev\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/my_project/dev\n\nValidation OK!\n\n>>> uv run [UV_ARGS] -q [CLI] bundle validate --output json\n{\n  \"with_development\": true,\n  \"without_development\": true\n}\n"
        	            	actual  : "\n>>> uv run [UV_ARGS] -q [CLI] bundle validate\nWarning: The \"development\" property of pipelines is deprecated. Use \"mode: development\" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.\n  at resources.pipelines.with_development.development\n  in resources.py:7:1\n\nName: my_project\nTarget: dev\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/my_project/dev\n\nFound 1 warning\n\n>>> uv run [UV_ARGS] -q [CLI] bundle validate --output json\nWarning: The \"development\" property of pipelines is deprecated. Use \"mode: development\" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.\n  at resources.pipelines.with_development.development\n  in resources.py:7:1\n\n{\n  \"with_development\": true,\n  \"without_development\": true\n}\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2,2 +2,6 @@
        	            	 >>> uv run [UV_ARGS] -q [CLI] bundle validate
        	            	+Warning: The "development" property of pipelines is deprecated. Use "mode: development" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.
        	            	+  at resources.pipelines.with_development.development
        	            	+  in resources.py:7:1
        	            	+
        	            	 Name: my_project
        	            	@@ -8,5 +12,9 @@
        	            	 
        	            	-Validation OK!
        	            	+Found 1 warning
        	            	 
        	            	 >>> uv run [UV_ARGS] -q [CLI] bundle validate --output json
        	            	+Warning: The "development" property of pipelines is deprecated. Use "mode: development" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.
        	            	+  at resources.pipelines.with_development.development
        	            	+  in resources.py:7:1
        	            	+
        	            	 {
        	Test:       	TestAccept/bundle/python/pipeline-development-deprecated/DMS=true/PYDAB_VERSION=0.266.0
        	Messages:   	bundle/python/pipeline-development-deprecated/output.txt vs /tmp/TestAcceptbundlepythonpipeline-development-deprecatedDMS=tru869465429/002/output.txt

latest (v1.22.1): same output as main (06660cf)

TestAccept/bundle/python/pipeline-development-deprecated/DMS=true/PYDAB_VERSION=current: branch ✅ | main (06660cf) ❌ | latest (v1.22.1) ❌

main (06660cf):

acceptance_test.go:1341: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1341
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1082
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:659
        	Error:      	Not equal: 
        	            	expected: "\n>>> uv run [UV_ARGS] -q [CLI] bundle validate\nName: my_project\nTarget: dev\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/my_project/dev\n\nValidation OK!\n\n>>> uv run [UV_ARGS] -q [CLI] bundle validate --output json\n{\n  \"with_development\": true,\n  \"without_development\": true\n}\n"
        	            	actual  : "\n>>> uv run [UV_ARGS] -q [CLI] bundle validate\nWarning: The \"development\" property of pipelines is deprecated. Use \"mode: development\" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.\n  at resources.pipelines.with_development.development\n  in resources.py:7:1\n\nName: my_project\nTarget: dev\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/my_project/dev\n\nFound 1 warning\n\n>>> uv run [UV_ARGS] -q [CLI] bundle validate --output json\nWarning: The \"development\" property of pipelines is deprecated. Use \"mode: development\" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.\n  at resources.pipelines.with_development.development\n  in resources.py:7:1\n\n{\n  \"with_development\": true,\n  \"without_development\": true\n}\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2,2 +2,6 @@
        	            	 >>> uv run [UV_ARGS] -q [CLI] bundle validate
        	            	+Warning: The "development" property of pipelines is deprecated. Use "mode: development" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.
        	            	+  at resources.pipelines.with_development.development
        	            	+  in resources.py:7:1
        	            	+
        	            	 Name: my_project
        	            	@@ -8,5 +12,9 @@
        	            	 
        	            	-Validation OK!
        	            	+Found 1 warning
        	            	 
        	            	 >>> uv run [UV_ARGS] -q [CLI] bundle validate --output json
        	            	+Warning: The "development" property of pipelines is deprecated. Use "mode: development" in your databricks.yml instead. See https://docs.databricks.com/dev-tools/bundles/deployment-modes.
        	            	+  at resources.pipelines.with_development.development
        	            	+  in resources.py:7:1
        	            	+
        	            	 {
        	Test:       	TestAccept/bundle/python/pipeline-development-deprecated/DMS=true/PYDAB_VERSION=current
        	Messages:   	bundle/python/pipeline-development-deprecated/output.txt vs /tmp/TestAcceptbundlepythonpipeline-development-deprecatedDMS=tru2650742114/002/output.txt

latest (v1.22.1): same output as main (06660cf)

TestAccept/bundle/refschema/DMS=: branch ✅ | main (06660cf) ❌ | latest (v1.22.1) ❌

main (06660cf):

acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/root.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=3127410706/001/output/root.txt
        @@ -1,4 +1,4 @@
        -__locations	*loctable.Locations	INPUT
        +__locations	*dynloc.Locations	INPUT
         __locations.files	[]string	INPUT
         __locations.files[*]	string	INPUT
         __locations.locations	map[string][][]int	INPUT

latest (v1.22.1):

acceptance_test.go:1341: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1341
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1082
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:659
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] bundle debug refschema --help\nDumps all available fields of the bundle config and of each resource type by walking the relevant types. Each line is a path to a field, type and set of tags:\n- INPUT: field is present in bundle config.\n- STATE: field is present in the state of the resource (direct deployment only).\n- REMOTE: field is present in the remote state of the resource (direct deployment only).\n- ALL: shortcut for all three.\n\nUsage:\n  databricks bundle debug refschema [flags]\n\nFlags:\n  -h, --help   help for refschema\n\nGlobal Flags:\n      --debug            enable debug logging\n  -o, --output type      output type: text or json (default text)\n  -p, --profile string   ~/.databrickscfg profile\n  -t, --target string    bundle target to use (if applicable)\n      --var strings      set values for variables defined in bundle config. Example: --var=\"foo=bar\"\n"
        	            	actual  : "\n>>> [CLI] bundle debug refschema --help\nDumps all available fields for each resource type by walking the relevant types. Each line is a path to a field, type and set of tags:\n- INPUT: field is present in bundle config.\n- STATE: field is present in the state of the resource (direct deployment only).\n- REMOTE: field is present in the remote state of the resource (direct deployment only).\n- ALL: shortcut for all three.\n\nUsage:\n  databricks bundle debug refschema [flags]\n\nFlags:\n  -h, --help   help for refschema\n\nGlobal Flags:\n      --debug            enable debug logging\n  -o, --output type      output type: text or json (default text)\n  -p, --profile string   ~/.databrickscfg profile\n  -t, --target string    bundle target to use (if applicable)\n      --var strings      set values for variables defined in bundle config. Example: --var=\"foo=bar\"\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2,3 +2,3 @@
        	            	 >>> [CLI] bundle debug refschema --help
        	            	-Dumps all available fields of the bundle config and of each resource type by walking the relevant types. Each line is a path to a field, type and set of tags:
        	            	+Dumps all available fields for each resource type by walking the relevant types. Each line is a path to a field, type and set of tags:
        	            	 - INPUT: field is present in bundle config.
        	Test:       	TestAccept/bundle/refschema/DMS=
        	Messages:   	bundle/refschema/output.txt vs /tmp/TestAcceptbundlerefschemaDMS=1918638667/002/output.txt
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/postgres_snapshot_schedules.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/postgres_snapshot_schedules.txt
        @@ -1,9 +1,6 @@
         resources.postgres_snapshot_schedules.*.branch	string	ALL
         resources.postgres_snapshot_schedules.*.id	string	INPUT
         resources.postgres_snapshot_schedules.*.lifecycle	resources.Lifecycle	INPUT
        -resources.postgres_snapshot_schedules.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.postgres_snapshot_schedules.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.postgres_snapshot_schedules.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.postgres_snapshot_schedules.*.lifecycle.prevent_destroy	bool	INPUT
         resources.postgres_snapshot_schedules.*.modified_status	string	INPUT
         resources.postgres_snapshot_schedules.*.name	string	REMOTE
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/postgres_databases.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/postgres_databases.txt
        @@ -2,9 +2,6 @@
         resources.postgres_databases.*.database_id	string	ALL
         resources.postgres_databases.*.id	string	INPUT
         resources.postgres_databases.*.lifecycle	resources.Lifecycle	INPUT
        -resources.postgres_databases.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.postgres_databases.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.postgres_databases.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.postgres_databases.*.lifecycle.prevent_destroy	bool	INPUT
         resources.postgres_databases.*.modified_status	string	INPUT
         resources.postgres_databases.*.name	string	REMOTE
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/database_instances.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/database_instances.txt
        @@ -27,9 +27,6 @@
         resources.database_instances.*.enable_readable_secondaries	bool	ALL
         resources.database_instances.*.id	string	INPUT
         resources.database_instances.*.lifecycle	resources.Lifecycle	INPUT
        -resources.database_instances.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.database_instances.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.database_instances.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.database_instances.*.lifecycle.prevent_destroy	bool	INPUT
         resources.database_instances.*.modified_status	string	INPUT
         resources.database_instances.*.name	string	ALL
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/postgres_roles.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/postgres_roles.txt
        @@ -7,9 +7,6 @@
         resources.postgres_roles.*.id	string	INPUT
         resources.postgres_roles.*.identity_type	postgres.RoleIdentityType	ALL
         resources.postgres_roles.*.lifecycle	resources.Lifecycle	INPUT
        -resources.postgres_roles.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.postgres_roles.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.postgres_roles.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.postgres_roles.*.lifecycle.prevent_destroy	bool	INPUT
         resources.postgres_roles.*.membership_roles	[]postgres.RoleMembershipRole	ALL
         resources.postgres_roles.*.membership_roles[*]	postgres.RoleMembershipRole	ALL
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/secrets.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/secrets.txt
        @@ -8,9 +8,6 @@
         resources.secrets.*.full_name	string	ALL
         resources.secrets.*.id	string	INPUT
         resources.secrets.*.lifecycle	resources.Lifecycle	INPUT
        -resources.secrets.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.secrets.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.secrets.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.secrets.*.lifecycle.prevent_destroy	bool	INPUT
         resources.secrets.*.metastore_id	string	ALL
         resources.secrets.*.modified_status	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/apps.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/apps.txt
        @@ -91,9 +91,6 @@
         resources.apps.*.lifecycle	*dresources.StateLifecycle	REMOTE	STATE
         resources.apps.*.lifecycle	*resources.LifecycleWithStarted	INPUT
         resources.apps.*.lifecycle	resources.Lifecycle	INPUT
        -resources.apps.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.apps.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.apps.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.apps.*.lifecycle.prevent_destroy	bool	INPUT
         resources.apps.*.lifecycle.started	*bool	ALL
         resources.apps.*.modified_status	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/external_locations.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/external_locations.txt
        @@ -60,9 +60,6 @@
         resources.external_locations.*.id	string	INPUT
         resources.external_locations.*.isolation_mode	catalog.IsolationMode	REMOTE
         resources.external_locations.*.lifecycle	resources.Lifecycle	INPUT
        -resources.external_locations.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.external_locations.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.external_locations.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.external_locations.*.lifecycle.prevent_destroy	bool	INPUT
         resources.external_locations.*.metastore_id	string	REMOTE
         resources.external_locations.*.modified_status	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/internal_immutable_snapshots.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/internal_immutable_snapshots.txt
        @@ -5,11 +5,6 @@
         resources.internal_immutable_snapshots.*.acl[*].service_principal_name	string	INPUT	STATE
         resources.internal_immutable_snapshots.*.acl[*].user_name	string	INPUT	STATE
         resources.internal_immutable_snapshots.*.bundle_id	string	INPUT	STATE
        -resources.internal_immutable_snapshots.*.can_manage	[]snapshot.ManagePrincipal	INPUT	STATE
        -resources.internal_immutable_snapshots.*.can_manage[*]	snapshot.ManagePrincipal	INPUT	STATE
        -resources.internal_immutable_snapshots.*.can_manage[*].group_name	string	INPUT	STATE
        -resources.internal_immutable_snapshots.*.can_manage[*].service_principal_name	string	INPUT	STATE
        -resources.internal_immutable_snapshots.*.can_manage[*].user_name	string	INPUT	STATE
         resources.internal_immutable_snapshots.*.full_path	string	REMOTE	STATE
         resources.internal_immutable_snapshots.*.relative_path	string	REMOTE	STATE
         resources.internal_immutable_snapshots.*.remote_root	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/job_runs.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/job_runs.txt
        @@ -11,9 +11,6 @@
         resources.job_runs.*.lifecycle	*dresources.JobRunLifecycleState	STATE
         resources.job_runs.*.lifecycle	*resources.JobRunLifecycle	INPUT
         resources.job_runs.*.lifecycle	resources.Lifecycle	INPUT
        -resources.job_runs.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.job_runs.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.job_runs.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.job_runs.*.lifecycle.prevent_destroy	bool	INPUT
         resources.job_runs.*.lifecycle.triggers	[]resources.JobRunTrigger	INPUT
         resources.job_runs.*.lifecycle.triggers[*]	resources.JobRunTrigger	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/jobs.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/jobs.txt
        @@ -196,9 +196,6 @@
         resources.jobs.*.job_clusters[*].serverless_compute_id	string	ALL
         resources.jobs.*.job_id	int64	REMOTE
         resources.jobs.*.lifecycle	resources.Lifecycle	INPUT
        -resources.jobs.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.jobs.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.jobs.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.jobs.*.lifecycle.prevent_destroy	bool	INPUT
         resources.jobs.*.max_concurrent_runs	int	ALL
         resources.jobs.*.modified_status	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/model_provider_services.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/model_provider_services.txt
        @@ -119,9 +119,6 @@
         resources.model_provider_services.*.config.targets[*].native_api_types[*]	string	ALL
         resources.model_provider_services.*.id	string	INPUT
         resources.model_provider_services.*.lifecycle	resources.Lifecycle	INPUT
        -resources.model_provider_services.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.model_provider_services.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.model_provider_services.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.model_provider_services.*.lifecycle.prevent_destroy	bool	INPUT
         resources.model_provider_services.*.model_provider_service_id	string	ALL
         resources.model_provider_services.*.modified_status	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/postgres_synced_tables.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/postgres_synced_tables.txt
        @@ -11,9 +11,6 @@
         resources.postgres_synced_tables.*.extra_columns[*].maintenance	postgres.SyncedTableSyncedTableSpecExtraColumnMaintenance	ALL
         resources.postgres_synced_tables.*.id	string	INPUT
         resources.postgres_synced_tables.*.lifecycle	resources.Lifecycle	INPUT
        -resources.postgres_synced_tables.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.postgres_synced_tables.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.postgres_synced_tables.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.postgres_synced_tables.*.lifecycle.prevent_destroy	bool	INPUT
         resources.postgres_synced_tables.*.modified_status	string	INPUT
         resources.postgres_synced_tables.*.name	string	REMOTE
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/vector_search_endpoints.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=1918638667/001/output/vector_search_endpoints.txt
        @@ -15,9 +15,6 @@
         resources.vector_search_endpoints.*.last_updated_timestamp	int64	REMOTE
         resources.vector_search_endpoints.*.last_updated_user	string	REMOTE
         resources.vector_search_endpoints.*.lifecycle	resources.Lifecycle	INPUT
        -resources.vector_search_endpoints.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.vector_search_endpoints.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.vector_search_endpoints.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.vector_search_endpoints.*.lifecycle.prevent_destroy	bool	INPUT
... (490 more lines truncated, raise DATABRICKS_CLI_TEST_MAX_LOG to see more)
TestAccept/bundle/refschema/DMS=true: branch ✅ | main (06660cf) ❌ | latest (v1.22.1) ❌

main (06660cf):

acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/root.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true60467952/001/output/root.txt
        @@ -1,4 +1,4 @@
        -__locations	*loctable.Locations	INPUT
        +__locations	*dynloc.Locations	INPUT
         __locations.files	[]string	INPUT
         __locations.files[*]	string	INPUT
         __locations.locations	map[string][][]int	INPUT

latest (v1.22.1):

acceptance_test.go:1341: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1341
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1082
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:659
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] bundle debug refschema --help\nDumps all available fields of the bundle config and of each resource type by walking the relevant types. Each line is a path to a field, type and set of tags:\n- INPUT: field is present in bundle config.\n- STATE: field is present in the state of the resource (direct deployment only).\n- REMOTE: field is present in the remote state of the resource (direct deployment only).\n- ALL: shortcut for all three.\n\nUsage:\n  databricks bundle debug refschema [flags]\n\nFlags:\n  -h, --help   help for refschema\n\nGlobal Flags:\n      --debug            enable debug logging\n  -o, --output type      output type: text or json (default text)\n  -p, --profile string   ~/.databrickscfg profile\n  -t, --target string    bundle target to use (if applicable)\n      --var strings      set values for variables defined in bundle config. Example: --var=\"foo=bar\"\n"
        	            	actual  : "\n>>> [CLI] bundle debug refschema --help\nDumps all available fields for each resource type by walking the relevant types. Each line is a path to a field, type and set of tags:\n- INPUT: field is present in bundle config.\n- STATE: field is present in the state of the resource (direct deployment only).\n- REMOTE: field is present in the remote state of the resource (direct deployment only).\n- ALL: shortcut for all three.\n\nUsage:\n  databricks bundle debug refschema [flags]\n\nFlags:\n  -h, --help   help for refschema\n\nGlobal Flags:\n      --debug            enable debug logging\n  -o, --output type      output type: text or json (default text)\n  -p, --profile string   ~/.databrickscfg profile\n  -t, --target string    bundle target to use (if applicable)\n      --var strings      set values for variables defined in bundle config. Example: --var=\"foo=bar\"\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2,3 +2,3 @@
        	            	 >>> [CLI] bundle debug refschema --help
        	            	-Dumps all available fields of the bundle config and of each resource type by walking the relevant types. Each line is a path to a field, type and set of tags:
        	            	+Dumps all available fields for each resource type by walking the relevant types. Each line is a path to a field, type and set of tags:
        	            	 - INPUT: field is present in bundle config.
        	Test:       	TestAccept/bundle/refschema/DMS=true
        	Messages:   	bundle/refschema/output.txt vs /tmp/TestAcceptbundlerefschemaDMS=true1484881460/002/output.txt
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/registered_models.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/registered_models.txt
        @@ -14,9 +14,6 @@
         resources.registered_models.*.full_name	string	ALL
         resources.registered_models.*.id	string	INPUT
         resources.registered_models.*.lifecycle	resources.Lifecycle	INPUT
        -resources.registered_models.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.registered_models.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.registered_models.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.registered_models.*.lifecycle.prevent_destroy	bool	INPUT
         resources.registered_models.*.metastore_id	string	ALL
         resources.registered_models.*.modified_status	string	INPUT
        
    acceptance_test.go:1312: Missing output file: output/root.txt
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/synced_database_tables.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/synced_database_tables.txt
        @@ -44,9 +44,6 @@
         resources.synced_database_tables.*.effective_logical_database_name	string	ALL
         resources.synced_database_tables.*.id	string	INPUT
         resources.synced_database_tables.*.lifecycle	resources.Lifecycle	INPUT
        -resources.synced_database_tables.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.synced_database_tables.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.synced_database_tables.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.synced_database_tables.*.lifecycle.prevent_destroy	bool	INPUT
         resources.synced_database_tables.*.logical_database_name	string	ALL
         resources.synced_database_tables.*.modified_status	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/volumes.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/volumes.txt
        @@ -11,9 +11,6 @@
         resources.volumes.*.full_name	string	REMOTE
         resources.volumes.*.id	string	INPUT
         resources.volumes.*.lifecycle	resources.Lifecycle	INPUT
        -resources.volumes.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.volumes.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.volumes.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.volumes.*.lifecycle.prevent_destroy	bool	INPUT
         resources.volumes.*.metastore_id	string	REMOTE
         resources.volumes.*.modified_status	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/cluster_policies.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/cluster_policies.txt
        @@ -23,9 +23,6 @@
         resources.cluster_policies.*.libraries[*].requirements	string	ALL
         resources.cluster_policies.*.libraries[*].whl	string	ALL
         resources.cluster_policies.*.lifecycle	resources.Lifecycle	INPUT
        -resources.cluster_policies.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.cluster_policies.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.cluster_policies.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.cluster_policies.*.lifecycle.prevent_destroy	bool	INPUT
         resources.cluster_policies.*.max_clusters_per_user	int64	ALL
         resources.cluster_policies.*.modified_status	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/job_runs.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/job_runs.txt
        @@ -11,9 +11,6 @@
         resources.job_runs.*.lifecycle	*dresources.JobRunLifecycleState	STATE
         resources.job_runs.*.lifecycle	*resources.JobRunLifecycle	INPUT
         resources.job_runs.*.lifecycle	resources.Lifecycle	INPUT
        -resources.job_runs.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.job_runs.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.job_runs.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.job_runs.*.lifecycle.prevent_destroy	bool	INPUT
         resources.job_runs.*.lifecycle.triggers	[]resources.JobRunTrigger	INPUT
         resources.job_runs.*.lifecycle.triggers[*]	resources.JobRunTrigger	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/postgres_endpoints.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/postgres_endpoints.txt
        @@ -10,9 +10,6 @@
         resources.postgres_endpoints.*.group.min	int	ALL
         resources.postgres_endpoints.*.id	string	INPUT
         resources.postgres_endpoints.*.lifecycle	resources.Lifecycle	INPUT
        -resources.postgres_endpoints.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.postgres_endpoints.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.postgres_endpoints.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.postgres_endpoints.*.lifecycle.prevent_destroy	bool	INPUT
         resources.postgres_endpoints.*.modified_status	string	INPUT
         resources.postgres_endpoints.*.name	string	REMOTE
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/postgres_projects.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/postgres_projects.txt
        @@ -27,9 +27,6 @@
         resources.postgres_projects.*.initial_endpoint_spec.no_suspension	bool	REMOTE
         resources.postgres_projects.*.initial_endpoint_spec.suspend_timeout_duration	*duration.Duration	REMOTE
         resources.postgres_projects.*.lifecycle	resources.Lifecycle	INPUT
        -resources.postgres_projects.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.postgres_projects.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.postgres_projects.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.postgres_projects.*.lifecycle.prevent_destroy	bool	INPUT
         resources.postgres_projects.*.modified_status	string	INPUT
         resources.postgres_projects.*.name	string	REMOTE
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/alerts.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/alerts.txt
        @@ -34,9 +34,6 @@
         resources.alerts.*.file_path	string	INPUT
         resources.alerts.*.id	string	ALL
         resources.alerts.*.lifecycle	resources.Lifecycle	INPUT
        -resources.alerts.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.alerts.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.alerts.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.alerts.*.lifecycle.prevent_destroy	bool	INPUT
         resources.alerts.*.lifecycle_state	sql.AlertLifecycleState	ALL
         resources.alerts.*.modified_status	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/clusters.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/clusters.txt
        @@ -140,9 +140,6 @@
         resources.clusters.*.lifecycle	*dresources.StateLifecycle	REMOTE	STATE
         resources.clusters.*.lifecycle	*resources.LifecycleWithStarted	INPUT
         resources.clusters.*.lifecycle	resources.Lifecycle	INPUT
        -resources.clusters.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.clusters.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.clusters.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.clusters.*.lifecycle.prevent_destroy	bool	INPUT
         resources.clusters.*.lifecycle.started	*bool	ALL
         resources.clusters.*.modified_status	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/experiments.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/experiments.txt
        @@ -4,9 +4,6 @@
         resources.experiments.*.id	string	INPUT
         resources.experiments.*.last_update_time	int64	REMOTE
         resources.experiments.*.lifecycle	resources.Lifecycle	INPUT
        -resources.experiments.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.experiments.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.experiments.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.experiments.*.lifecycle.prevent_destroy	bool	INPUT
         resources.experiments.*.lifecycle_stage	string	REMOTE
         resources.experiments.*.modified_status	string	INPUT
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/postgres_databases.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/postgres_databases.txt
        @@ -2,9 +2,6 @@
         resources.postgres_databases.*.database_id	string	ALL
         resources.postgres_databases.*.id	string	INPUT
         resources.postgres_databases.*.lifecycle	resources.Lifecycle	INPUT
        -resources.postgres_databases.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.postgres_databases.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.postgres_databases.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.postgres_databases.*.lifecycle.prevent_destroy	bool	INPUT
         resources.postgres_databases.*.modified_status	string	INPUT
         resources.postgres_databases.*.name	string	REMOTE
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/database_instances.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/database_instances.txt
        @@ -27,9 +27,6 @@
         resources.database_instances.*.enable_readable_secondaries	bool	ALL
         resources.database_instances.*.id	string	INPUT
         resources.database_instances.*.lifecycle	resources.Lifecycle	INPUT
        -resources.database_instances.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.database_instances.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.database_instances.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.database_instances.*.lifecycle.prevent_destroy	bool	INPUT
         resources.database_instances.*.modified_status	string	INPUT
         resources.database_instances.*.name	string	ALL
        
    acceptance_test.go:1341: Diff:
        --- bundle/refschema/output/external_locations.txt
        +++ /tmp/TestAcceptbundlerefschemaDMS=true1484881460/001/output/external_locations.txt
        @@ -60,9 +60,6 @@
         resources.external_locations.*.id	string	INPUT
         resources.external_locations.*.isolation_mode	catalog.IsolationMode	REMOTE
         resources.external_locations.*.lifecycle	resources.Lifecycle	INPUT
        -resources.external_locations.*.lifecycle.depends_on	[]resources.DependsOn	INPUT
        -resources.external_locations.*.lifecycle.depends_on[*]	resources.DependsOn	INPUT
        -resources.external_locations.*.lifecycle.depends_on[*].resource	string	INPUT
         resources.external_locations.*.lifecycle.prevent_destroy	bool	INPUT
         resources.external_locations.*.metastore_id	string	REMOTE
... (490 more lines truncated, raise DATABRICKS_CLI_TEST_MAX_LOG to see more)
TestAccept/bundle/strict_profile_match/default_profile/host/DMS=: branch ✅ | main (06660cf) ❌ | latest (v1.22.1) ❌

main (06660cf):

acceptance_test.go:1341: Diff:
        --- bundle/strict_profile_match/default_profile/host/output.txt
        +++ /tmp/TestAcceptbundlestrict_profile_matchdefault_profilehostDMS=2230181608/002/output.txt
        @@ -18,7 +18,7 @@
         Name: strict-profile-match
         Target: classic_other_workspace
         Workspace:
        -  Host: [DATABRICKS_URL]/?o=2222222222
        +  Host: [DATABRICKS_URL]
         
         Found 1 error

latest (v1.22.1): same output as main (06660cf)

TestAccept/bundle/strict_profile_match/default_profile/host/DMS=true: branch ✅ | main (06660cf) ❌ | latest (v1.22.1) ❌

main (06660cf):

acceptance_test.go:1341: Diff:
        --- bundle/strict_profile_match/default_profile/host/output.txt
        +++ /tmp/TestAcceptbundlestrict_profile_matchdefault_profilehostDMS=906183455/002/output.txt
        @@ -18,7 +18,7 @@
         Name: strict-profile-match
         Target: classic_other_workspace
         Workspace:
        -  Host: [DATABRICKS_URL]/?o=2222222222
        +  Host: [DATABRICKS_URL]
         
         Found 1 error
         
        
FAIL

latest (v1.22.1):

acceptance_test.go:1341: Diff:
        --- bundle/strict_profile_match/default_profile/host/output.txt
        +++ /tmp/TestAcceptbundlestrict_profile_matchdefault_profilehostDMS=1169281544/002/output.txt
        @@ -18,7 +18,7 @@
         Name: strict-profile-match
         Target: classic_other_workspace
         Workspace:
        -  Host: [DATABRICKS_URL]/?o=2222222222
        +  Host: [DATABRICKS_URL]
         
         Found 1 error
TestAccept/bundle/strict_profile_match/host/DMS=: branch ✅ | main (06660cf) ❌ | latest (v1.22.1) ❌

main (06660cf):

acceptance_test.go:1341: Diff:
        --- bundle/strict_profile_match/host/output.txt
        +++ /tmp/TestAcceptbundlestrict_profile_matchhostDMS=241352241/002/output.txt
        @@ -22,7 +22,7 @@
         Name: strict-profile-match
         Target: classic_other_workspace
         Workspace:
        -  Host: [DATABRICKS_URL]/?o=2222222222
        +  Host: [DATABRICKS_URL]
         
         Found 1 error
         
        @@ -48,7 +48,7 @@
         Name: strict-profile-match
         Target: custom_host_other_workspace
         Workspace:
        -  Host: [CUSTOM_HOST]/?o=2222222222
        +  Host: [CUSTOM_HOST]
         
         Found 1 error

latest (v1.22.1): same output as main (06660cf)

TestAccept/bundle/strict_profile_match/host/DMS=true: branch ✅ | main (06660cf) ❌ | latest (v1.22.1) ❌

main (06660cf):

acceptance_test.go:1341: Diff:
        --- bundle/strict_profile_match/host/output.txt
        +++ /tmp/TestAcceptbundlestrict_profile_matchhostDMS=true3577536958/002/output.txt
        @@ -22,7 +22,7 @@
         Name: strict-profile-match
         Target: classic_other_workspace
         Workspace:
        -  Host: [DATABRICKS_URL]/?o=2222222222
        +  Host: [DATABRICKS_URL]
         
         Found 1 error
         
        @@ -48,7 +48,7 @@
         Name: strict-profile-match
         Target: custom_host_other_workspace
         Workspace:
        -  Host: [CUSTOM_HOST]/?o=2222222222
        +  Host: [CUSTOM_HOST]
         
         Found 1 error

latest (v1.22.1): same output as main (06660cf)

TestAccept/bundle/validate/app_resource_duplicate_name_location/DMS=: branch ✅ | main (06660cf) ❌ | latest (v1.22.1) ❌

main (06660cf):

acceptance_test.go:1341: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1341
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1082
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:659
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] bundle validate\nWarning: invalid value \"INVALID\" for enum field. Valid values are [CAN_MANAGE CAN_MANAGE_RUN CAN_VIEW IS_OWNER]\n  at resources.apps.app.resources[0].job.permission\n  in databricks.yml:17:25\n\nName: test-bundle\nTarget: default\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/test-bundle/default\n\nFound 1 warning\n\n>>> [CLI] bundle validate -o json\nWarning: invalid value \"INVALID\" for enum field. Valid values are [CAN_MANAGE CAN_MANAGE_RUN CAN_VIEW IS_OWNER]\n  at resources.apps.app.resources[0].job.permission\n  in databricks.yml:17:25\n\n[\n  {\n    \"job\": {\n      \"id\": \"2\",\n      \"permission\": \"INVALID\"\n    },\n    \"name\": \"job\"\n  }\n]\n"
        	            	actual  : "\n>>> [CLI] bundle validate\nWarning: invalid value \"INVALID\" for enum field. Valid values are [CAN_MANAGE CAN_MANAGE_RUN CAN_VIEW IS_OWNER]\n  at resources.apps.app.resources[0].job.permission\n  in databricks.yml:13:25\n\nName: test-bundle\nTarget: default\nWorkspace:\n  User: [USERNAME]\n  Path: /Workspace/Users/[USERNAME]/.bundle/test-bundle/default\n\nFound 1 warning\n\n>>> [CLI] bundle validate -o json\nWarning: invalid value \"INVALID\" for enum field. Valid values are [CAN_MANAGE CAN_MANAGE_RUN CAN_VIEW IS_OWNER]\n  at resources.apps.app.resources[0].job.permission\n  in databricks.yml:13:25\n\n[\n  {\n    \"job\": {\n      \"id\": \"2\",\n      \"permission\": \"INVALID\"\n    },\n    \"name\": \"job\"\n  }\n]\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -4,3 +4,3 @@
        	            	   at resources.apps.app.resources[0].job.permission
        	            	-  in databricks.yml:17:25
        	            	+  in databricks.yml:13:25
        	            	 
        	            	@@ -17,3 +17,3 @@
        	            	   at resources.apps.app.resources[0].job.permission
        	            	-  in databricks.yml:17:25
        	            	+  in databricks.yml:13:25
        	            	 
        	Test:       	TestAccept/bundle/validate/app_resource_duplicate_name_location/DMS=
        	Messages:   	bundle/validate/app_resource_duplicate_name_location/output.txt vs /tmp/TestAcceptbundlevalidateapp_resource_duplicate_name_location2424214436/002/output.txt

latest (v1.22.1): same output as main (06660cf)

11 more failure details omitted, see the full report in the run.

@denik
denik force-pushed the denik/typed-config-walkers branch from 857e2d4 to b9d8067 Compare October 20, 2026 12:56
denik added a commit that referenced this pull request Oct 20, 2026
Co-authored-by: Isaac <no-reply@databricks.com>
ruslantalpa pushed a commit to ruslantalpa/cli that referenced this pull request Oct 21, 2026
## Changes

Add `ForceSendFields` to `Presets`, `Lifecycle` and `Deployment`, so
explicit zero values (`false`, `0`, `""`) written in a target or include
replace non-zero base values.

Fixes on main: `targets.dev.resources.jobs.j.lifecycle.prevent_destroy:
false` was ignored and the base `true` stayed.

Visible change: `bundle validate -o json` now shows explicit zero
presets (e.g. `name_prefix: ""`) instead of `presets: {}`.

Not added to `Target`, `Workspace`, `Bundle`, `Experimental`, `Lock`,
`Artifact` or the other structs: they have pointer/map/slice fields, and
`ForceSendFields` there turns explicit `null` overrides (e.g. `run_as:`)
into forced values.

Prerequisite for removing `libs/dyn` (databricks#7098).

## Tests

- New `validate/lifecycle_override`: fails on main, passes here.
- `validate/includes/clears_unforced_preset_values` golden updated.
- Both pass on the databricks#7098 branch with this patch applied.

This pull request and its description were written by Isaac.

---------

Co-authored-by: Isaac <no-reply@databricks.com>
denik added a commit that referenced this pull request Oct 21, 2026
Replace the generated pattern tables, matched against every node of the
dynamic configuration with a trie, by generated walkers that descend
only along the patterns' paths of the typed configuration. Null, zero,
pure-reference values and locations still come from the dyn.Value at
each node (walk_node.go), so the diagnostics are unchanged.

Slice of #7098.

Co-authored-by: Isaac <no-reply@databricks.com>
denik added a commit that referenced this pull request Oct 21, 2026
Replace the generated pattern tables, matched against every node of the
dynamic configuration with a trie, by generated walkers that descend
only along the patterns' paths of the typed configuration. Null, zero,
pure-reference values and locations still come from the dyn.Value at
each node (walk_node.go), so the diagnostics are unchanged.

Slice of #7098.

Co-authored-by: Isaac <no-reply@databricks.com>
@denik
denik force-pushed the denik/typed-config-walkers branch from d95e7b1 to 19dde68 Compare October 21, 2026 15:50
denik added a commit that referenced this pull request Oct 21, 2026
Co-authored-by: Isaac <no-reply@databricks.com>
@denik
denik changed the base branch from main to denik/required-enum-typed-walkers October 21, 2026 15:50
@denik
denik added this pull request to stack #7150 October 21, 2026 15:50
denik added a commit that referenced this pull request Oct 21, 2026
Replace the generated pattern tables, matched against every node of the
dynamic configuration with a trie, by generated walkers that descend
only along the patterns' paths of the typed configuration. Null, zero,
pure-reference values and locations still come from the dyn.Value at
each node (walk_node.go), so the diagnostics are unchanged.

Slice of #7098.

Co-authored-by: Isaac <no-reply@databricks.com>
@denik
denik force-pushed the denik/typed-config-walkers branch from 19dde68 to e82320b Compare October 21, 2026 16:03
denik added a commit that referenced this pull request Oct 21, 2026
Co-authored-by: Isaac <no-reply@databricks.com>
denik added a commit that referenced this pull request Oct 21, 2026
Replace the generated pattern tables, matched against every node of the
dynamic configuration with a trie, by generated walkers that descend
only along the patterns' paths of the typed configuration. Null, zero,
pure-reference values and locations still come from the dyn.Value at
each node (walk_node.go), so the diagnostics are unchanged.

Slice of #7098.

Co-authored-by: Isaac <no-reply@databricks.com>
@denik
denik force-pushed the denik/typed-config-walkers branch from e82320b to 4df1dd5 Compare October 21, 2026 16:12
denik added a commit that referenced this pull request Oct 21, 2026
Co-authored-by: Isaac <no-reply@databricks.com>
denik and others added 30 commits October 29, 2026 12:38
…ong type

Assign zeroed the slot, which left an empty string in lists and maps like main
did not. Delete now removes slice elements, and resolution applies the
updates from the last element to the first.

Co-authored-by: Isaac <no-reply@databricks.com>
…nerated code for the typed configuration

Co-authored-by: Isaac <no-reply@databricks.com>
Co-authored-by: Isaac <no-reply@databricks.com>
…as written

Co-authored-by: Isaac <no-reply@databricks.com>
Co-authored-by: Isaac <no-reply@databricks.com>
Co-authored-by: Isaac <no-reply@databricks.com>
…uctvar; regenerate for the SDK update

Co-authored-by: Isaac <no-reply@databricks.com>
…on; regenerate for the typed configuration

Co-authored-by: Isaac <no-reply@databricks.com>
…typed

Co-authored-by: Isaac <no-reply@databricks.com>
Co-authored-by: Isaac <no-reply@databricks.com>
… a Badness the hybrid fixes

Co-authored-by: Isaac <no-reply@databricks.com>
…sts of the load phase

dynvar is replaced by structvar's identical reference helpers; merge keeps only Merge;
pattern strings, tries and read-only walks are dropped. Unit tests that start from a
typed configuration apply load-phase mutators via bundletest.ApplyLoading.

Co-authored-by: Isaac <no-reply@databricks.com>
…eference; record the schedule warnings as Badness
Co-authored-by: Isaac <no-reply@databricks.com>
 in the struct generators)

Co-authored-by: Isaac <no-reply@databricks.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AIR Databricks AI Runtime CLI DABs DABs related issues PyDABs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants